gcc和g++是什么关系?

您所在的位置:网站首页 gcc c gcc和g++是什么关系?

gcc和g++是什么关系?

#gcc和g++是什么关系?| 来源: 网络整理| 查看: 265

我写过一篇这个文章, 介绍了 GCC 的整体架构

GCC 是 GNU 编译器集合的意思, 对于用户能用的常用命令, 有 gcc 和 g++.

无论是 gcc 还是 g++, 他们的定位都是 driver.

driver 负责调用编译器(狭义), 把源码编译到汇编代码. 比如 C 语言的编译器(狭义)是 cc1, 而 C++ 语言的编译器(狭义)是 cc1plus.

driver 再调用 as, 把汇编代码变成二进制代码. 最后调用 ld, 负责把二进制代码拼在一起.

gcc 和 g++ 的区别无非就是调用的编译器不同, 并且传递给链接器的参数不同.

具体而言

g++ 会把 .c 文件当做是 C++ 语言 (在 .c 文件前后分别加上 -xc++ 和 -xnone, 强行变成 C++), 从而调用 cc1plus 进行编译.

g++ 遇到 .cpp 文件也会当做是 C++, 调用 cc1plus 进行编译.

g++ 还会默认告诉链接器, 让它链接上 C++ 标准库.

gcc 会把 .c 文件当做是 C 语言. 从而调用 cc1 进行编译.

gcc 遇到 .cpp 文件, 会处理成 C++ 语言. 调用 cc1plus 进行编译.

gcc 默认不会链接上 C++ 标准库.

这些区别都可以在 @d41d8c 回答中的那两个源代码中看到.

driver 一般会根据文件后缀名确定它是什么语言. 下面这段 GCC 的源代码中, 就储存了文件后缀名和处理流程的默认对应关系.

比如你可以用 gcc 或者 g++ 编译一个 .d 后缀名的文件 (D 语言), 那么他就会试图调用 d21 (D 语言相应的编译器)

在我电脑上不存在 D 语言的编译器, 所以就会失败.

或者也可以用 gfortran 编译一个 .c 文件. (会调用 cc1)

去年刚接触 C++ 的时候, 我也一直很困惑这些内容. 网上各种乱七八糟的解释都有. 现在的我终于有能力看 GCC 的源代码了, 还是感觉源代码最真实了, 不会骗我, 怎么写就是怎么样.

最常见的误导性言论是说 gcc 会调用 g++ 或者说 g++ 会调用 gcc.

可是 gccg++ 都是 driver 啊! 实际上 gcc 遇到 .cpp 调用的是 cc1plus, 就像 gcc 遇到 .d 文件会调用 d21 而不是 gdc (也是 driver), 遇到 .f 文件会调用 f951 而不是 gfortran (也是 driver) 一样.

就是左上角的这两个!

为啥没人问 gcc/gfortran 有什么不同呢? 哈哈哈

更多有关 GCC 的故事可以看我那篇文章



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3